home *** CD-ROM | disk | FTP | other *** search
- #include "6502.h"
- #include "global.h"
- #include "stack.h"
-
- #ifndef ____GETVALUE____
- #include "getValue.h"
- #endif
-
- Boolean gDone = false;
- UInt16 pc = 0;
- UInt8 regA = 0, regX = 0, regY = 0, regP = 0, sp = sizeof(Page);
- UInt8* gStartofProg = nil;
-
- PagePtr gMyMemoryPages = nil;
- UInt8* gPageZero = nil;
- UInt8* gStack = nil;
-
- #define SETSTATUSBIT(bit) regP |= bit
- #define CLEARSTATUSBIT(bit) regP &= ~bit
- #define GETSTATUS(bit) ((regP & bit) ? 1 : 0)
-
- #define SETNSTATUS(reg) if (reg & NBit) SETSTATUSBIT(NBit); else CLEARSTATUSBIT(NBit)
- #define SETZSTATUS(reg) if (reg == 0) SETSTATUSBIT(ZBit); else CLEARSTATUSBIT(ZBit)
-
- #define UInt8ToSInt16(num) ((num & 0x7F) * ((num & 0x80) ? -1 : 1))
-
- #define NMI 0xFFFA // NON MASKABLE INTERUPT VECTOR
- #define RES 0xFFFC // RESET VECTOR
- #define IRQ 0xFFFE // INTERUPT REQUEST VECTOR
-
- //////////////////////////////////////////////
- //
- // ADC Add with Carry to A
- //
- //////////////////////////////////////////////
- void _ADC(UInt8 opByte)
- {
- SInt16 l_a, h_a, l_opByte, h_opByte, l_result, h_result, result, tempA, tempopByte;
-
- if (GETSTATUS(DBit)) {
- l_a = (regA & 0x0F);
- h_a = ((regA & 0xF0) >> 4);
- l_opByte = (opByte & 0x0F);
- h_opByte = ((opByte & 0xF0) >> 4);
-
- l_result = (l_a + l_opByte + GETSTATUS(CBit));
- h_result = (l_result > 9) ? (h_a + h_opByte + 1) : (h_a + h_opByte);
-
- if (h_result > 9) {
- SETSTATUSBIT(CBit);
- }
- else {
- CLEARSTATUSBIT(CBit);
- }
- regA = (((h_result % 10) << 4) + (l_result % 10));
- }
- else {
- result = (regA + opByte + GETSTATUS(CBit));
-
- tempA = UInt8ToSInt16(regA);
- tempopByte = UInt8ToSInt16(opByte);
-
- if (((tempA<128) && (tempopByte<128) && ((result%256)>127)) ||
- ((tempA>127) && (tempopByte>127) && ((result%256<128)))) {
- SETSTATUSBIT(VBit);
- }
- else {
- CLEARSTATUSBIT(VBit);
- }
-
- regA = (result % 256);
- if (result > 255) {
- SETSTATUSBIT(CBit);
- }
- else {
- CLEARSTATUSBIT(CBit);
- }
- }
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // AND And to A
- //
- //////////////////////////////////////////////
- void _AND(UInt8 opByte)
- {
- regA &= opByte;
- if (GETSTATUS(CBit)) {
- ++regA;
- }
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _ASL Arithmetic shift left
- //
- //////////////////////////////////////////////
- void _ASL(UInt8* addr)
- {
- UInt8 theBye = ((*addr) << 1);
- if (*addr & 0x80)
- SETSTATUSBIT(CBit);
- else
- CLEARSTATUSBIT(CBit);
-
- *addr = theBye;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- }
-
- //////////////////////////////////////////////
- //
- // _BCC Branch Carry Clear
- //
- //////////////////////////////////////////////
- void _BCC(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(CBit) == 0) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BCS Branch Carry Set
- //
- //////////////////////////////////////////////
- void _BCS(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(CBit)) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BEQ Branch Equal
- //
- //////////////////////////////////////////////
- void _BEQ(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(ZBit)) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BNE Branch Not Equal
- //
- //////////////////////////////////////////////
- void _BNE(UInt8 opByte)
- {
-
- SInt8 theOffset = 0;
-
- if (GETSTATUS(ZBit) == 0) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BMI Branch Minus
- //
- //////////////////////////////////////////////
- void _BMI(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(NBit)) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BPL Branch Plus
- //
- //////////////////////////////////////////////
- void _BPL(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(NBit) == 0) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BVC Branch Overflow Clear
- //
- //////////////////////////////////////////////
- void _BVC(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(VBit) == 0) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BVS Branch Overflow Set
- //
- //////////////////////////////////////////////
- void _BVS(UInt8 opByte)
- {
- SInt8 theOffset = 0;
- if (GETSTATUS(VBit)) {
- theOffset |= opByte;
- if (theOffset < 0) {
- pc -= (-theOffset);
- }
- else {
- pc += theOffset;
- }
- }
- }
-
- //////////////////////////////////////////////
- //
- // _BIT And With Accumulator (A Unchanged)
- //
- //////////////////////////////////////////////
- void _BIT(UInt8* addr)
- {
- UInt8 theBye = *addr;
-
- theBye &= regA;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- if (theBye & 0x40)
- SETSTATUSBIT(VBit);
- else
- CLEARSTATUSBIT(VBit);
- }
-
- //////////////////////////////////////////////
- //
- // _BRK Break
- //
- //////////////////////////////////////////////
- void _BRK(void)
- {
- regP |= BBit;
- PushWord(pc);
- PushByte(regP);
- pc = IRQ;
- return;
- }
-
- //////////////////////////////////////////////
- //
- // _CLC Clear carry
- //
- //////////////////////////////////////////////
- void _CLC(void)
- {
- regP &= ~CBit;
- }
-
- //////////////////////////////////////////////
- //
- // _CLD Clear Decimal
- //
- //////////////////////////////////////////////
- void _CLD(void)
- {
- regP &= ~DBit;
- }
-
- //////////////////////////////////////////////
- //
- // _CLI Clear Interupt
- //
- //////////////////////////////////////////////
- void _CLI(void)
- {
- regP &= ~IBit;
- }
-
- //////////////////////////////////////////////
- //
- // _CLV Clear Overflow
- //
- //////////////////////////////////////////////
- void _CLV(void)
- {
- regP &= ~VBit;
- }
-
- //////////////////////////////////////////////
- //
- // _CMP Compare to A
- //
- //////////////////////////////////////////////
- void _CMP(UInt8 opByte)
- {
- SInt16 tempregA, tempopByte, result;
-
- tempregA = UInt8ToSInt16(regA);
- tempopByte = UInt8ToSInt16(opByte);
-
- result = tempregA - tempopByte;
- if (result < 0) {
- result += 256;
- CLEARSTATUSBIT(CBit);
- }
- else {
- SETSTATUSBIT(CBit);
- }
- SETNSTATUS(result);
- SETZSTATUS(result);
- }
-
- //////////////////////////////////////////////
- //
- // _CPX Compare to X
- //
- //////////////////////////////////////////////
- void _CPX(UInt8 opByte)
- {
- SInt16 tempregX, tempopByte, result;
-
- tempregX = UInt8ToSInt16(regX);
- tempopByte = UInt8ToSInt16(opByte);
-
- result = tempregX - tempopByte;
- if (result < 0) {
- result += 256;
- CLEARSTATUSBIT(CBit);
- }
- else {
- SETSTATUSBIT(CBit);
- }
- SETNSTATUS(result);
- SETZSTATUS(result);
- }
-
- //////////////////////////////////////////////
- //
- // _CPY Compare to Y
- //
- //////////////////////////////////////////////
- void _CPY(UInt8 opByte)
- {
- SInt16 tempregY, tempopByte, result;
-
- tempregY = UInt8ToSInt16(regY);
- tempopByte = UInt8ToSInt16(opByte);
-
- result = tempregY - tempopByte;
- if (result < 0) {
- result += 256;
- CLEARSTATUSBIT(CBit);
- }
- else {
- SETSTATUSBIT(CBit);
- }
- SETNSTATUS(result);
- SETZSTATUS(result);
- }
-
- //////////////////////////////////////////////
- //
- // _DEC Decrement by one
- //
- //////////////////////////////////////////////
- void _DEC(UInt8* addr)
- {
- UInt8 theBye = *addr;
-
- theBye--;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- *addr = theBye;
- }
-
- //////////////////////////////////////////////
- //
- // _DEX Decrement X by one
- //
- //////////////////////////////////////////////
- void _DEX(void)
- {
- regX--;
- SETNSTATUS(regX);
- SETZSTATUS(regX);
- }
-
- //////////////////////////////////////////////
- //
- // _DEY Decrement Y by one
- //
- //////////////////////////////////////////////
- void _DEY(void)
- {
- regY--;
- SETNSTATUS(regY);
- SETZSTATUS(regY);
- }
-
- //////////////////////////////////////////////
- //
- // _EOR XOR to Y
- //
- //////////////////////////////////////////////
- void _EOR(UInt8 opByte)
- {
- regA ^= opByte;
-
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _INC Increment by one
- //
- //////////////////////////////////////////////
- void _INC(UInt8* addr)
- {
- UInt8 theBye = *addr;
-
- theBye++;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- *addr = theBye;
- }
-
- //////////////////////////////////////////////
- //
- // _INX Increment X by one
- //
- //////////////////////////////////////////////
- void _INX(void)
- {
- regX++;
- SETNSTATUS(regX);
- SETZSTATUS(regX);
- }
-
- //////////////////////////////////////////////
- //
- // _INY Increment Y by one
- //
- //////////////////////////////////////////////
- void _INY(void)
- {
- regY++;
- SETNSTATUS(regY);
- SETZSTATUS(regY);
- }
-
- //////////////////////////////////////////////
- //
- // _JMP Jump to new location
- //
- //////////////////////////////////////////////
- void _JMP(UInt16 address)
- {
- pc = address;
- }
-
- //////////////////////////////////////////////
- //
- // _JSR Jump to SubRoutine
- //
- //////////////////////////////////////////////
- void _JSR(UInt16 address)
- {
- PushWord(pc -1);
- pc = address;
- }
-
- //////////////////////////////////////////////
- //
- // _LDA Load accumulator
- //
- //////////////////////////////////////////////
- void _LDA(UInt8 opByte)
- {
- regA = opByte;
-
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _LDX Load X
- //
- //////////////////////////////////////////////
- void _LDX(UInt8 opByte)
- {
- regX = opByte;
-
- SETNSTATUS(regX);
- SETZSTATUS(regX);
- }
-
- //////////////////////////////////////////////
- //
- // _LDY Load Y
- //
- //////////////////////////////////////////////
- void _LDY(UInt8 opByte)
- {
-
- regY = opByte;
-
- SETNSTATUS(regY);
- SETZSTATUS(regY);
- }
-
- //////////////////////////////////////////////
- //
- // _LSR Logical shift right
- //
- //////////////////////////////////////////////
- void _LSR(UInt8* addr)
- {
- UInt8 theBye = ((*addr) >> 1);
- if (*addr & 0x01)
- SETSTATUSBIT(CBit);
- else
- CLEARSTATUSBIT(CBit);
-
- *addr = theBye;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- }
-
- //////////////////////////////////////////////
- //
- // _NOP No operation
- //
- //////////////////////////////////////////////
- void _NOP(void)
- {
- return;
- }
-
- //////////////////////////////////////////////
- //
- // _ORA Or with Accumulator
- //
- //////////////////////////////////////////////
- void _ORA(UInt8 opByte)
- {
- regA |= opByte;
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _PHA Push A on stack
- //
- //////////////////////////////////////////////
- void _PHA(void)
- {
- PushByte(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _PHP Push P on stack
- //
- //////////////////////////////////////////////
- void _PHP(void)
- {
- PushByte(regP);
- }
-
- //////////////////////////////////////////////
- //
- // _PLA Pop A from stack
- //
- //////////////////////////////////////////////
- void _PLA(void)
- {
- regA = PopByte();
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _PLP Pop P from stack
- //
- //////////////////////////////////////////////
- void _PLP(void)
- {
- regP = PopByte();
- }
-
- //////////////////////////////////////////////
- //
- // _ROL Rotate left through carry
- //
- //////////////////////////////////////////////
- void _ROL(UInt8* addr)
- {
- UInt8 theBye = ((*addr) << 1);
-
- if (GETSTATUS(CBit))
- theBye |= 0x01;
-
- if (*addr & 0x80)
- SETSTATUSBIT(CBit);
- else
- CLEARSTATUSBIT(CBit);
-
- *addr = theBye;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- }
-
- //////////////////////////////////////////////
- //
- // _ROR Rotate right through carry
- //
- //////////////////////////////////////////////
- void _ROR(UInt8* addr)
- {
- UInt8 theBye = ((*addr) >> 1);
-
- if (GETSTATUS(CBit))
- theBye |= 0x80;
-
- if (*addr & 0x01)
- SETSTATUSBIT(CBit);
- else
- CLEARSTATUSBIT(CBit);
-
- *addr = theBye;
- SETNSTATUS(theBye);
- SETZSTATUS(theBye);
- }
-
- //////////////////////////////////////////////
- //
- // RTI Return From Interupt
- //
- //////////////////////////////////////////////
- void _RTI(void)
- {
- regP = PopByte();
- pc = PopWord();
- }
-
- //////////////////////////////////////////////
- //
- // RTS Return Subroutine
- //
- //////////////////////////////////////////////
- void _RTS(void)
- {
- UInt8 oldsp = sp;
- UInt16 addr = PopWord();
-
- if (oldsp < sp) {
- gDone = true;
- return;
- }
- pc = addr;
- pc++;
- }
-
- //////////////////////////////////////////////
- //
- // SBC Subtract with Carry to A
- //
- //////////////////////////////////////////////
- void _SBC(UInt8 opByte)
- {
- SInt16 a_a, a_opByte, result, tempA, tempopByte;
-
- if (GETSTATUS(DBit)) {
- a_a = (((regA & 0xF0) >> 4) * 10) + (regA & 0x0F);
- a_opByte = (((opByte & 0xF0) >> 4) * 10) + (opByte & 0x0F);
- result = a_a - a_opByte;
-
- if (result <0) {
- SETSTATUSBIT(CBit);
- result = 100 - result;
- }
- else {
- CLEARSTATUSBIT(CBit);
- }
- regA = ((result % 10) + ((result / 10) << 4));
- }
- else {
- tempA = UInt8ToSInt16(regA);
- tempopByte = UInt8ToSInt16(opByte);
-
- result = (tempA + GETSTATUS(CBit) + (255 - tempopByte));
-
- tempA = UInt8ToSInt16(regA);
- tempopByte = UInt8ToSInt16(opByte);
-
- if (((tempA<128) && (tempopByte<128) && ((result & 0xFF)>127)) ||
- ((tempA>127) && (tempopByte>127) && ((result & 0xFF)<128))) {
- SETSTATUSBIT(VBit);
- }
- else {
- CLEARSTATUSBIT(VBit);
- }
-
- if (result > 255) {
- SETSTATUSBIT(CBit);
- }
- else {
- CLEARSTATUSBIT(CBit);
- }
- regA = (result & 0xFF);
- }
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _SEC Set Carry
- //
- //////////////////////////////////////////////
- void _SEC(void)
- {
- regP |= CBit;
- }
-
- //////////////////////////////////////////////
- //
- // _SED Set Decimal Mode
- //
- //////////////////////////////////////////////
- void _SED(void)
- {
- regP |= DBit;
- }
-
- //////////////////////////////////////////////
- //
- // _SEI Set IRQ Disable
- //
- //////////////////////////////////////////////
- void _SEI(void)
- {
- regP |= IBit;
- }
-
- //////////////////////////////////////////////
- //
- // _STA Store A
- //
- //////////////////////////////////////////////
- void _STA(UInt8* addr)
- {
- *addr = regA;
- }
-
- //////////////////////////////////////////////
- //
- // _STX Store X
- //
- //////////////////////////////////////////////
- void _STX(UInt8* addr)
- {
- *addr = regX;
- }
-
- //////////////////////////////////////////////
- //
- // _STY Store Y
- //
- //////////////////////////////////////////////
- void _STY(UInt8* addr)
- {
- *addr = regY;
- }
-
- //////////////////////////////////////////////
- //
- // _TAX Transfer A to X
- //
- //////////////////////////////////////////////
- void _TAX(void)
- {
- regX = regA;
- SETNSTATUS(regX);
- SETZSTATUS(regX);
- }
-
- //////////////////////////////////////////////
- //
- // _TAY Transfer A to Y
- //
- //////////////////////////////////////////////
- void _TAY(void)
- {
- regY = regA;
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _TSX Transfer Stack to X
- //
- //////////////////////////////////////////////
- void _TSX(void)
- {
- regX = sp;
- SETNSTATUS(regX);
- SETZSTATUS(regX);
- }
-
- //////////////////////////////////////////////
- //
- // _TXA Transfer X to A
- //
- //////////////////////////////////////////////
- void _TXA(void)
- {
- regA = regX;
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
- //////////////////////////////////////////////
- //
- // _TXS Transfer X to Stack
- //
- //////////////////////////////////////////////
- void _TXS(void)
- {
- sp = regX;
- SETNSTATUS(sp);
- SETZSTATUS(sp);
- }
-
- //////////////////////////////////////////////
- //
- // _TYA Transfer Y to A
- //
- //////////////////////////////////////////////
- void _TYA(void)
- {
- regA = regY;
- SETNSTATUS(regA);
- SETZSTATUS(regA);
- }
-
-
-
- #define OP(op, mode) { ##op##_##mode, ##op, _##op##mode, #op, ##mode}
- #define FUNCTION_ZEROBYTE(op, mode) void _##op##mode(void) {_ ##op (); }
- #define FUNCTION_ONEBYTE(op, mode) void _##op##mode(void) {_ ##op (Get##mode##Value()); }
- #define FUNCTION_TWOBYTE(op, mode) void _##op##mode(void) {_ ##op (Get##mode##Address()); }
- #define FUNCTION_TWOBYTEPC(op, mode) void _##op##mode(void) {_ ##op (Get##mode##PCAddress()); }
-
- // Create functions to deal with addressing modes
-
- FUNCTION_ONEBYTE(ADC, Immediate)
- FUNCTION_ONEBYTE(ADC, Absolute)
- FUNCTION_ONEBYTE(ADC, ZeroPage)
- FUNCTION_ONEBYTE(ADC, IndX)
- FUNCTION_ONEBYTE(ADC, IndY)
- FUNCTION_ONEBYTE(ADC, ZeroPageX)
- FUNCTION_ONEBYTE(ADC, AbsoluteX)
- FUNCTION_ONEBYTE(ADC, AbsoluteY)
- FUNCTION_ONEBYTE(AND, Immediate)
- FUNCTION_ONEBYTE(AND, Absolute)
- FUNCTION_ONEBYTE(AND, ZeroPage)
- FUNCTION_ONEBYTE(AND, IndX)
- FUNCTION_ONEBYTE(AND, IndY)
- FUNCTION_ONEBYTE(AND, ZeroPageX)
- FUNCTION_ONEBYTE(AND, AbsoluteX)
- FUNCTION_ONEBYTE(AND, AbsoluteY)
- FUNCTION_TWOBYTE(ASL, Absolute)
- FUNCTION_TWOBYTE(ASL, ZeroPage)
- FUNCTION_TWOBYTE(ASL, Accumulator)
- FUNCTION_TWOBYTE(ASL, ZeroPageX)
- FUNCTION_TWOBYTE(ASL, AbsoluteX)
- FUNCTION_ONEBYTE(BCC, Relative)
- FUNCTION_ONEBYTE(BCS, Relative)
- FUNCTION_ONEBYTE(BEQ, Relative)
- FUNCTION_ONEBYTE(BNE, Relative)
- FUNCTION_ONEBYTE(BMI, Relative)
- FUNCTION_ONEBYTE(BPL, Relative)
- FUNCTION_ONEBYTE(BVC, Relative)
- FUNCTION_ONEBYTE(BVS, Relative)
- FUNCTION_TWOBYTE(BIT, Absolute)
- FUNCTION_TWOBYTE(BIT, ZeroPage)
- FUNCTION_ZEROBYTE(BRK, None)
- FUNCTION_ZEROBYTE(CLC, None)
- FUNCTION_ZEROBYTE(CLD, None)
- FUNCTION_ZEROBYTE(CLI, None)
- FUNCTION_ZEROBYTE(CLV, None)
- FUNCTION_ONEBYTE(CMP, Immediate)
- FUNCTION_ONEBYTE(CMP, Absolute)
- FUNCTION_ONEBYTE(CMP, ZeroPage)
- FUNCTION_ONEBYTE(CMP, IndX)
- FUNCTION_ONEBYTE(CMP, IndY)
- FUNCTION_ONEBYTE(CMP, ZeroPageX)
- FUNCTION_ONEBYTE(CMP, AbsoluteX)
- FUNCTION_ONEBYTE(CMP, AbsoluteY)
- FUNCTION_ONEBYTE(CPX, Immediate)
- FUNCTION_ONEBYTE(CPX, Absolute)
- FUNCTION_ONEBYTE(CPX, ZeroPage)
- FUNCTION_ONEBYTE(CPY, Immediate)
- FUNCTION_ONEBYTE(CPY, Absolute)
- FUNCTION_ONEBYTE(CPY, ZeroPage)
- FUNCTION_TWOBYTE(DEC, Absolute)
- FUNCTION_TWOBYTE(DEC, ZeroPage)
- FUNCTION_TWOBYTE(DEC, ZeroPageX)
- FUNCTION_TWOBYTE(DEC, AbsoluteX)
- FUNCTION_ZEROBYTE(DEX, None)
- FUNCTION_ZEROBYTE(DEY, None)
- FUNCTION_ONEBYTE(EOR, Immediate)
- FUNCTION_ONEBYTE(EOR, Absolute)
- FUNCTION_ONEBYTE(EOR, ZeroPage)
- FUNCTION_ONEBYTE(EOR, IndX)
- FUNCTION_ONEBYTE(EOR, IndY)
- FUNCTION_ONEBYTE(EOR, ZeroPageX)
- FUNCTION_ONEBYTE(EOR, AbsoluteX)
- FUNCTION_ONEBYTE(EOR, AbsoluteY)
- FUNCTION_TWOBYTE(INC, Absolute)
- FUNCTION_TWOBYTE(INC, ZeroPage)
- FUNCTION_TWOBYTE(INC, ZeroPageX)
- FUNCTION_TWOBYTE(INC, AbsoluteX)
- FUNCTION_ZEROBYTE(INX, None)
- FUNCTION_ZEROBYTE(INY, None)
- FUNCTION_TWOBYTEPC(JMP, Absolute)
- FUNCTION_TWOBYTEPC(JMP, Indirect)
- FUNCTION_TWOBYTEPC(JSR, Absolute)
- FUNCTION_ONEBYTE(LDA, Immediate)
- FUNCTION_ONEBYTE(LDA, Absolute)
- FUNCTION_ONEBYTE(LDA, ZeroPage)
- FUNCTION_ONEBYTE(LDA, IndX)
- FUNCTION_ONEBYTE(LDA, IndY)
- FUNCTION_ONEBYTE(LDA, ZeroPageX)
- FUNCTION_ONEBYTE(LDA, AbsoluteX)
- FUNCTION_ONEBYTE(LDA, AbsoluteY)
- FUNCTION_ONEBYTE(LDX, Immediate)
- FUNCTION_ONEBYTE(LDX, Absolute)
- FUNCTION_ONEBYTE(LDX, ZeroPage)
- FUNCTION_ONEBYTE(LDX, AbsoluteY)
- FUNCTION_ONEBYTE(LDX, ZeroPageY)
- FUNCTION_ONEBYTE(LDY, Immediate)
- FUNCTION_ONEBYTE(LDY, Absolute)
- FUNCTION_ONEBYTE(LDY, ZeroPage)
- FUNCTION_ONEBYTE(LDY, ZeroPageX)
- FUNCTION_ONEBYTE(LDY, AbsoluteX)
- FUNCTION_TWOBYTE(LSR, Absolute)
- FUNCTION_TWOBYTE(LSR, ZeroPage)
- FUNCTION_TWOBYTE(LSR, Accumulator)
- FUNCTION_TWOBYTE(LSR, ZeroPageX)
- FUNCTION_TWOBYTE(LSR, AbsoluteX)
- FUNCTION_ZEROBYTE(NOP, None);
- FUNCTION_ONEBYTE(ORA, Immediate)
- FUNCTION_ONEBYTE(ORA, Absolute)
- FUNCTION_ONEBYTE(ORA, ZeroPage)
- FUNCTION_ONEBYTE(ORA, IndX)
- FUNCTION_ONEBYTE(ORA, IndY)
- FUNCTION_ONEBYTE(ORA, ZeroPageX)
- FUNCTION_ONEBYTE(ORA, AbsoluteX)
- FUNCTION_ONEBYTE(ORA, AbsoluteY)
- FUNCTION_ZEROBYTE(PHA, None)
- FUNCTION_ZEROBYTE(PHP, None)
- FUNCTION_ZEROBYTE(PLA, None)
- FUNCTION_ZEROBYTE(PLP, None)
- FUNCTION_TWOBYTE(ROL, Absolute)
- FUNCTION_TWOBYTE(ROL, ZeroPage)
- FUNCTION_TWOBYTE(ROL, Accumulator)
- FUNCTION_TWOBYTE(ROL, ZeroPageX)
- FUNCTION_TWOBYTE(ROL, AbsoluteX)
- FUNCTION_TWOBYTE(ROR, Absolute)
- FUNCTION_TWOBYTE(ROR, ZeroPage)
- FUNCTION_TWOBYTE(ROR, Accumulator)
- FUNCTION_TWOBYTE(ROR, ZeroPageX)
- FUNCTION_TWOBYTE(ROR, AbsoluteX)
- FUNCTION_ZEROBYTE(RTI, None)
- FUNCTION_ZEROBYTE(RTS, None)
- FUNCTION_ONEBYTE(SBC, Immediate)
- FUNCTION_ONEBYTE(SBC, Absolute)
- FUNCTION_ONEBYTE(SBC, ZeroPage)
- FUNCTION_ONEBYTE(SBC, IndX)
- FUNCTION_ONEBYTE(SBC, IndY)
- FUNCTION_ONEBYTE(SBC, ZeroPageX)
- FUNCTION_ONEBYTE(SBC, AbsoluteX)
- FUNCTION_ONEBYTE(SBC, AbsoluteY)
- FUNCTION_ZEROBYTE(SEC, None)
- FUNCTION_ZEROBYTE(SED, None)
- FUNCTION_ZEROBYTE(SEI, None)
- FUNCTION_TWOBYTE(STA, Absolute)
- FUNCTION_TWOBYTE(STA, ZeroPage)
- FUNCTION_TWOBYTE(STA, IndX)
- FUNCTION_TWOBYTE(STA, IndY)
- FUNCTION_TWOBYTE(STA, ZeroPageX)
- FUNCTION_TWOBYTE(STA, AbsoluteX)
- FUNCTION_TWOBYTE(STA, AbsoluteY)
- FUNCTION_TWOBYTE(STX, Absolute)
- FUNCTION_TWOBYTE(STX, ZeroPage)
- FUNCTION_TWOBYTE(STX, ZeroPageY)
- FUNCTION_TWOBYTE(STY, Absolute)
- FUNCTION_TWOBYTE(STY, ZeroPage)
- FUNCTION_TWOBYTE(STY, ZeroPageX)
- FUNCTION_ZEROBYTE(TAX, None)
- FUNCTION_ZEROBYTE(TAY, None)
- FUNCTION_ZEROBYTE(TSX, None)
- FUNCTION_ZEROBYTE(TXA, None)
- FUNCTION_ZEROBYTE(TXS, None)
- FUNCTION_ZEROBYTE(TYA, None)
-
- // create opcode table with functions
- OpTable gOpCodeBase[] = {
- OP(ADC, Immediate),
- OP(ADC, Absolute),
- OP(ADC, ZeroPage),
- OP(ADC, IndX),
- OP(ADC, IndY),
- OP(ADC, ZeroPageX),
- OP(ADC, AbsoluteX),
- OP(ADC, AbsoluteY),
- OP(AND, Immediate),
- OP(AND, Absolute),
- OP(AND, ZeroPage),
- OP(AND, IndX),
- OP(AND, IndY),
- OP(AND, ZeroPageX),
- OP(AND, AbsoluteX),
- OP(AND, AbsoluteY),
- OP(ASL, Absolute),
- OP(ASL, ZeroPage),
- OP(ASL, Accumulator),
- OP(ASL, ZeroPageX),
- OP(ASL, AbsoluteX),
- OP(BCC, Relative),
- OP(BCS, Relative),
- OP(BEQ, Relative),
- OP(BNE, Relative),
- OP(BMI, Relative),
- OP(BPL, Relative),
- OP(BVC, Relative),
- OP(BVS, Relative),
- OP(BIT, Absolute),
- OP(BIT, ZeroPage),
- OP(BRK, None),
- OP(CLC, None),
- OP(CLD, None),
- OP(CLI, None),
- OP(CLV, None),
- OP(CMP, Immediate),
- OP(CMP, Absolute),
- OP(CMP, ZeroPage),
- OP(CMP, IndX),
- OP(CMP, IndY),
- OP(CMP, ZeroPageX),
- OP(CMP, AbsoluteX),
- OP(CMP, AbsoluteY),
- OP(CPX, Immediate),
- OP(CPX, Absolute),
- OP(CPX, ZeroPage),
- OP(CPY, Immediate),
- OP(CPY, Absolute),
- OP(CPY, ZeroPage),
- OP(DEC, Absolute),
- OP(DEC, ZeroPage),
- OP(DEC, ZeroPageX),
- OP(DEC, AbsoluteX),
- OP(DEX, None),
- OP(DEY, None),
- OP(EOR, Immediate),
- OP(EOR, Absolute),
- OP(EOR, ZeroPage),
- OP(EOR, IndX),
- OP(EOR, IndY),
- OP(EOR, ZeroPageX),
- OP(EOR, AbsoluteX),
- OP(EOR, AbsoluteY),
- OP(INC, Absolute),
- OP(INC, ZeroPage),
- OP(INC, ZeroPageX),
- OP(INC, AbsoluteX),
- OP(INX, None),
- OP(INY, None),
- OP(JMP, Absolute),
- OP(JMP, Indirect),
- OP(JSR, Absolute),
- OP(LDA, Immediate),
- OP(LDA, Absolute),
- OP(LDA, ZeroPage),
- OP(LDA, IndX),
- OP(LDA, IndY),
- OP(LDA, ZeroPageX),
- OP(LDA, AbsoluteX),
- OP(LDA, AbsoluteY),
- OP(LDX, Immediate),
- OP(LDX, Absolute),
- OP(LDX, ZeroPage),
- OP(LDX, AbsoluteY),
- OP(LDX, ZeroPageY),
- OP(LDY, Immediate),
- OP(LDY, Absolute),
- OP(LDY, ZeroPage),
- OP(LDY, ZeroPageX),
- OP(LDY, AbsoluteX),
- OP(LSR, Absolute),
- OP(LSR, ZeroPage),
- OP(LSR, Accumulator),
- OP(LSR, ZeroPageX),
- OP(LSR, AbsoluteX),
- OP(NOP, None),
- OP(ORA, Immediate),
- OP(ORA, Absolute),
- OP(ORA, ZeroPage),
- OP(ORA, IndX),
- OP(ORA, IndY),
- OP(ORA, ZeroPageX),
- OP(ORA, AbsoluteX),
- OP(ORA, AbsoluteY),
- OP(PHA, None),
- OP(PHP, None),
- OP(PLA, None),
- OP(PLP, None),
- OP(ROL, Absolute),
- OP(ROL, ZeroPage),
- OP(ROL, Accumulator),
- OP(ROL, ZeroPageX),
- OP(ROL, AbsoluteX),
- OP(ROR, Absolute),
- OP(ROR, ZeroPage),
- OP(ROR, Accumulator),
- OP(ROR, ZeroPageX),
- OP(ROR, AbsoluteX),
- OP(RTI, None),
- OP(RTS, None),
- OP(SBC, Immediate),
- OP(SBC, Absolute),
- OP(SBC, ZeroPage),
- OP(SBC, IndX),
- OP(SBC, IndY),
- OP(SBC, ZeroPageX),
- OP(SBC, AbsoluteX),
- OP(SBC, AbsoluteY),
- OP(SEC, None),
- OP(SED, None),
- OP(SEI, None),
- OP(STA, Absolute),
- OP(STA, ZeroPage),
- OP(STA, IndX),
- OP(STA, IndY),
- OP(STA, ZeroPageX),
- OP(STA, AbsoluteX),
- OP(STA, AbsoluteY),
- OP(STX, Absolute),
- OP(STX, ZeroPage),
- OP(STX, ZeroPageY),
- OP(STY, Absolute),
- OP(STY, ZeroPage),
- OP(STY, ZeroPageX),
- OP(TAX, None),
- OP(TAY, None),
- OP(TSX, None),
- OP(TXA, None),
- OP(TXS, None),
- OP(TYA, None)
- };
- #define kNumOpCodes sizeof(gOpCodeBase) / sizeof(OpTable)
- UInt8 gNumOpCodes = kNumOpCodes;
-
-